#ifndef CUMATRIX_H
#define CUMATRIX_H

#include "Matrix.h"
#include "QuantizationMatrix.h"

#include "cuda.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

class CUMatrix
{
public:
	__device__ CUMatrix() {}
	__device__ ~CUMatrix() {delete[] _matrix;}

    /*
    ** When using operator[] mind the way the matrix is defined.
    ** The matrix is column major.
    */
    __device__ double operator[]( const int i ) const { return _matrix[i]; }
    __device__ double getRowMajorElement(const int i) const {}


	__host__ CUMatrix& operator=(Matrix& matrix) {}
	__device__ CUMatrix& operator=(CUMatrix& matrix) {}
    __device__ CUMatrix operator+(CUMatrix &matrix) const {}
    __device__ CUMatrix operator-(CUMatrix &matrix) const {}
    __device__ CUMatrix operator*(CUMatrix &matrix) const {}

    // Dequantizate matrix
    __device__ Matrix operator*( QuantizationMatrix &matrix ) const {}

    // Quantizate matrix
    __device__ Matrix operator/( QuantizationMatrix &matrix ) const {}

    __device__ void loadIdentity() {}
    /*
    ** When using setMatrix mind the way the matrix is defined.
    ** The matrix is column major.
    */
    __device__ void setMatrix(double* matrix) {}
    __device__ void round() {}
    __device__ void normalize() {}
    __device__ void deNormalize() {}
    __device__ void flattenHighValues() {}

    /*
    ** When using setMatrixRowMajor note that the row major array is inputted in the column major array of this class.
    ** The class matrix is column major.
    */
    __device__ double* getMatrix()const{return _matrix;}
    __device__ const int size() const { return _size; }
    __device__ const int columnLength() const { return _columnLength; }
    __device__ void setSize(int size) {}
    __device__ void setElement(int i, double e) {}

private:
    double* _matrix;
    int _size;
    int _columnLength;

    __device__ double calculateMatrixMultElement (int pos, const double* first, const double* second) const {}
};

#endif